<?php


namespace App\Api\Fcjd;
use App\Domain\User\User as UserDomain;
use PhalApi\Api;
use PhalApi\Exception\BadRequestException;

/**
 * 非常检单日志
 *
 * @author: dogstar <chanzonghuang@gmail.com> 2014-10-04
 */
class Log extends Api
{

    public function getRules()
    {
        return array(
            'log'       => array(
                'oaid' => array('name' => 'oaid', 'require' => true, 'desc' => 'oaid'),
                'content' => array('name' => 'content', 'require' => false, 'desc' => '日志内容'),
                'url' => array('name' => 'url', 'require' => false, 'desc' => '图片或文件链接'),
                'type' => array('name' => 'type', 'require' => false, 'default' => 'text', 'desc' => '日志类型：text/image'),
            ),
            'delold' => array(),
        );
    }

    /**
     * 删除旧数据
     * @desc 删除ipods_list_sz表中2024年1月1日之前的数据
     * @return array data 操作结果
     * @exception 400 非法请求，参数传递错误
     */
    public function delold()
    {
        // CORS 设置
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
        header('Access-Control-Allow-Headers: *');

        $cutoffDate = '2024-01-01 00:00:00';
        
        try {
            // 删除2024年1月1日之前的数据
            $result = \PhalApi\DI()->notorm->ipods_list_sz
                ->where('create_time < ?', $cutoffDate)
                ->delete();
            
            \PhalApi\DI()->response->setMsg('成功删除' . $result . '条旧数据');
            \PhalApi\DI()->response->setRet(200);
            return array('deleted_count' => $result);
            
        } catch (\Exception $e) {
            throw new BadRequestException('删除旧数据失败: ' . $e->getMessage(), 500);
        }
    }


    /**
     * 日志接口
     * @desc 记录用户日志信息
     * @return array data 操作结果
     * @exception 400 非法请求，参数传递错误
     */
    public function log()
    {
        // CORS 设置
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
        header('Access-Control-Allow-Headers: *');

        $oaid = $this->oaid;
        $content = $this->content;
        $url = $this->url;
        $type = $this->type;
        
        return false;
        // 设置每个oaid最大保留的日志数量
        $maxLogsPerOaid = 10000;
        
        // 先插入新记录
        $logData = array(
            'oaid' => $oaid,
            'content' => $content,
            'url' => $url,
            'type' => $type,
            'create_time' => date('Y-m-d H:i:s'),
        );
        
        // 使用事务来确保数据一致性
        try {
            // 获取当前 oaid 的日志总数
            $logCount = \PhalApi\DI()->notorm->phone_log
                ->where(array('oaid' => $oaid, "type" => $type))
                ->count();

            // 如果超过10000条，删除最早的记录
            if ($logCount >= $maxLogsPerOaid) {
                $deleteCount = $logCount - $maxLogsPerOaid + 1;
                
                $oldRecords = \PhalApi\DI()->notorm->phone_log
                    ->where(array('oaid' => $oaid, "type" => $type))
                    ->order('create_time ASC')
                    ->limit($deleteCount)
                    ->fetchAll();
                    
                // 获取要删除的最大ID
                // 获取要删除的最大ID - 保留最新的1万条记录
                // 因为 $oldRecords 是按 create_time 升序排序,所以这些是最早的记录,需要被删除
                // 我们只取最早的 $deleteCount 条记录中最大的ID作为删除边界
                // 这样可以确保删除最早的记录,保留最新的1万条
                $maxIdToDelete = end($oldRecords)['id']; // 获取最早的 $deleteCount 条记录中的最大ID
                
                // 批量删除小于等于该ID的记录
                \PhalApi\DI()->notorm->phone_log
                    ->where(array('oaid' => $oaid, "type" => $type))
                    ->where('id <= ?', $maxIdToDelete)
                    ->delete();
            }
            
            // 插入新记录
            $result = \PhalApi\DI()->notorm->phone_log->insert($logData);
            
            \PhalApi\DI()->response->setMsg('日志记录成功');
            \PhalApi\DI()->response->setRet(200);
            return $result['id'];
            
        } catch (\Exception $e) {
            \PhalApi\DI()->notorm->rollback();
            throw new BadRequestException('日志记录失败: ' . $e->getMessage(), 500);
        }
    }

}
